/**
 * @author Vitor Franco do Carmo (vitor.carmo@cpmbraxis.com)
 * @since 28/07/2013
 *
 */
package br.com.vfcfw.commons.domain.filter;

import java.io.Serializable;
import java.util.Map;

import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.type.StandardBasicTypes;

import br.com.vfcfw.commons.domain.entity.BaseEntity;
import br.com.vfcfw.commons.util.SQLText;
import br.com.vfcfw.commons.util.StringUtil;

/**
 * Classe base para os filtros das entidades persistentes.
 * 
 * @author Vitor Franco do Carmo (vitor.carmo@cpmbraxis.com)
 * @since 28/07/2013
 * 
 */
public abstract class BaseFilter<E extends BaseEntity> implements Serializable {

    /** */
    private static final long serialVersionUID = -4381270299703028416L;

    private E entity;

    /**
     * Construtor da classe.
     */
    public BaseFilter() {

        super();
    }

    /**
     * Construtor da classe.
     * 
     * @param entity Entidade persistente.
     */
    public BaseFilter(E entity) {

        super();
        this.entity = entity;
    }

    /**
     * Retorna o {@link DetachedCriteria} que será usado para pesquisar por critérios. .
     * 
     * @return {@link DetachedCriteria}.
     */
    public abstract DetachedCriteria getDetachedCriteria();

    /**
     * Retorna o {@link SQLText} que será usado para pesquisar por JPQL/HQL/SQL.
     * 
     * @return {@link SQLText}.
     */
    public abstract SQLText getSQL();

    /**
     * Retorna o {@link SQLText} que será usado para pesquisar por sentença nativa SQL.
     * 
     * @return {@link SQLText}.
     */
    public SQLText getNativeSQL() {

        return null;
    }

    /**
     * Retorna as projeções e seus tipos específicos. Os Tipos podem ser representados por {@link StandardBasicTypes} ou
     * pelo Class.getName();
     * 
     * @return
     */
    public Map<String, Object> getProjecao() {

        return null;
    }

    /**
     * Retorna o valor do atributo entity.
     * 
     * @return Valor do atributo entity.
     */
    public E getEntity() {

        return entity;
    }

    /**
     * Especifica o valor do atributo entity.
     * 
     * @param entity E do entity a ser setado.
     */
    public void setEntity(E entity) {

        this.entity = entity;
    }

    /**
     * Verifica se o valor é nulo ou vazio.
     * 
     * @param valor Valor.
     * @return <tt>TRUE</tt> se não for <b>nulo</b> ou <b>vazio</b>, <tt>FALSE</tt> caso contrário.
     */
    public boolean possuiValor(final Object valor) {

        return StringUtil.possuiValor(valor);
    }

}
